Generalized Algebraic Data Types